/* PDCurses */

#include <curspriv.h>

/*man-start**************************************************************

printw
------

### Synopsis

    int printw(const char *fmt, ...);
    int wprintw(WINDOW *win, const char *fmt, ...);
    int mvprintw(int y, int x, const char *fmt, ...);
    int mvwprintw(WINDOW *win, int y, int x, const char *fmt,...);
    int vwprintw(WINDOW *win, const char *fmt, va_list varglist);
    int vw_printw(WINDOW *win, const char *fmt, va_list varglist);

### Description

   The printw() functions add a formatted string to the window at the
   current or specified cursor position. The format strings are the same
   as used in the standard C library's printf(). (printw() can be used
   as a drop-in replacement for printf().)

   The duplication between vwprintw() and vw_printw() is for historic
   reasons. In PDCurses, they're the same.

### Return Value

   All functions return the number of characters printed, or ERR on
   error.

### Portability
                             X/Open  ncurses  NetBSD
    printw                      Y       Y       Y
    wprintw                     Y       Y       Y
    mvprintw                    Y       Y       Y
    mvwprintw                   Y       Y       Y
    vwprintw                    Y       Y       Y
    vw_printw                   Y       Y       Y

**man-end****************************************************************/

#include <string.h>

int vwprintw( WINDOW* win, const char* fmt, va_list varglist )
{
	char printbuf[513];
	int len;

	PDC_LOG( ( "vwprintw() - called\n" ) );

#ifdef HAVE_VSNPRINTF
	len = vsnprintf( printbuf, 512, fmt, varglist );
#else
	len = vsprintf( printbuf, fmt, varglist );
#endif
	return ( waddstr( win, printbuf ) == ERR ) ? ERR : len;
}

int printw( const char* fmt, ... )
{
	va_list args;
	int retval;

	PDC_LOG( ( "printw() - called\n" ) );

	va_start( args, fmt );
	retval = vwprintw( stdscr, fmt, args );
	va_end( args );

	return retval;
}

int wprintw( WINDOW* win, const char* fmt, ... )
{
	va_list args;
	int retval;

	PDC_LOG( ( "wprintw() - called\n" ) );

	va_start( args, fmt );
	retval = vwprintw( win, fmt, args );
	va_end( args );

	return retval;
}

int mvprintw( int y, int x, const char* fmt, ... )
{
	va_list args;
	int retval;

	PDC_LOG( ( "mvprintw() - called\n" ) );

	if( move( y, x ) == ERR )
	{
		return ERR;
	}

	va_start( args, fmt );
	retval = vwprintw( stdscr, fmt, args );
	va_end( args );

	return retval;
}

int mvwprintw( WINDOW* win, int y, int x, const char* fmt, ... )
{
	va_list args;
	int retval;

	PDC_LOG( ( "mvwprintw() - called\n" ) );

	if( wmove( win, y, x ) == ERR )
	{
		return ERR;
	}

	va_start( args, fmt );
	retval = vwprintw( win, fmt, args );
	va_end( args );

	return retval;
}

int vw_printw( WINDOW* win, const char* fmt, va_list varglist )
{
	PDC_LOG( ( "vw_printw() - called\n" ) );

	return vwprintw( win, fmt, varglist );
}
